package br.com.cpqd.ssar.posprocessamento;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.StringTokenizer;
import java.util.Vector;

class readingFileMovieFDTD3D {

    private Vector listCubeElements = new Vector();
    private CubeElement nCube;
    private Temporizador t;
    private char[] line = null;
    private String[] vline = null;
    private String caminho;
    private Double maiorCampo = 0.0;
    private Double menorCampo = 0.0;
    private StringTokenizer st;
    private int numPassos,  numMalha;
    private FileInputStream is;                 // Stream de Entrada
    private BufferedReader br;                  // Buffer de leitura
    private Double cor;

    public readingFileMovieFDTD3D() {
    }

    public void reading(String fileNameMovie3d) throws FileNotFoundException, IOException {
        String s;
        RenderizadorOff rOff = new RenderizadorOff();
        t = new Temporizador();

        // definindo maior e menor campo
        try {

            is = new FileInputStream(fileNameMovie3d);
            br = new BufferedReader(new InputStreamReader(is));

            //converte a linha de char para string
            while ((s = br.readLine()) != null) {

                if (!s.contains("time")) {

                    //divide essa string em x,y,z e campo
                    vline = split(s);
                    //define maior e menor campo para calcular 'range'
                    if (maiorCampo < Double.parseDouble(vline[4])) {
                        maiorCampo = Double.parseDouble(vline[4]);
                        System.out.println("maior campo: " + maiorCampo);
                    }
                    if (menorCampo > Double.parseDouble(vline[4])) {
                        menorCampo = Double.parseDouble(vline[4]);
                    }
                }
            }
            is.close();
            br.close();

        } catch (IOException exc) {
            System.out.println(exc);
            System.exit(1);
        }

        //System.out.println("Tempo para definir maior e menor campo: " + t.toString());

        t = new Temporizador();
        System.out.println("Maior Campo: " + maiorCampo);
        System.out.println("Menor Campo: " + menorCampo);

        ImportadorArquivo arquivo = null;
        try {

            arquivo = new ImportadorArquivo();


        } catch (Exception e) {
            System.out.println("Erro: " + e.toString());

        }
        if (arquivo.getName() != null) {           

            int aux = 0;
            caminho = arquivo.getName();
            Double range = Math.abs(maiorCampo - menorCampo);
            //lendo o arquivo e criando malha 3D de resultados
            try {
                is = new FileInputStream(fileNameMovie3d);
                br = new BufferedReader(new InputStreamReader(is));

                while ((s = br.readLine()) != null) {

                    if (s.contains("time")) {

                        rOff.run(listCubeElements, aux, caminho);
                        listCubeElements.clear();
                        aux++;

                    } else {

                        //divide essa string em x,y,z e campo
                        vline = split(s);

                        if (Double.parseDouble(vline[4]) != 0.0d) {

                            cor = ((Double.parseDouble(vline[4]) - menorCampo) / (range / 10)) / 10;
                            //  System.out.println("cor: " + cor);
                            nCube = new CubeElement(Double.parseDouble(vline[1]), Double.parseDouble(vline[2]), Double.parseDouble(vline[3]), cor);
                            listCubeElements.add(nCube);

                        }

                    }
                }


            } catch (IOException exc) {
                System.out.println(exc);
                System.exit(1);
            }
        }




    }

    public String[] split(String sentence) {
        //vetor que contem x,y,z e campo

        String[] tokens = null;

        String splitPattern = " ";

        tokens = sentence.split(splitPattern);

        if (tokens == null) {
            String msg = "   NO MATCH: pattern:" + sentence + "\r\n             regex: " + splitPattern;
        } else {
            return tokens;
        }
        return tokens;

    }

    public Double setColorField(Double campo) {

        Double range;
        Double passo;
        Double RGB = 255.0;

        // primeiro caso
        if ((menorCampo < 0) && (maiorCampo > 0) && (campo < 0)) {

            range = Math.abs(menorCampo) + Math.abs(maiorCampo);
            passo = range / RGB; //rangeCor = 255 RGB
            cor = (Math.abs(menorCampo - campo) / passo) / 255;


        }

        if ((menorCampo < 0.0) && (maiorCampo > 0.0) && (campo > 0.0)) {
            range = Math.abs(menorCampo) + Math.abs(maiorCampo);
            passo = range / RGB;
            cor = (Math.abs(-menorCampo + campo) / passo) / 255;


        }

        if ((menorCampo > 0.0) && (maiorCampo > 0.0) && (campo > 0.0)) {
            range = maiorCampo - menorCampo;
            cor = (((Math.abs(campo - menorCampo) * RGB) / range) * (RGB / range)) / 255;


        }
        return cor;

    }

    public int[] getConfigMalha() {
        int[] configMalha = new int[2];
        configMalha[0] = this.numPassos;
        configMalha[1] = this.numMalha;
        return configMalha;
    }
}

